import java.util.Observable;
import java.util.Observer;
import java.util.HashMap;
import java.util.Map;

// 消息发布者
class Publisher extends Observable {
	private Map<String, Subscriber> subscribers = new HashMap<>();

	void addSubscriber(Subscriber subscriber) {
		subscribers.put(subscriber.getName(), subscriber);
		addObserver(subscriber);
	}

	void publishMessage(String message, String... subscriberNames) {
		for (String name : subscriberNames) {
			Subscriber subscriber = subscribers.get(name);
			if (subscriber != null) {
				setChanged();
				notifyObservers(subscriber);
			}
		}
	}
}

// 消息订阅者
class Subscriber implements Observer {
	private String name;

	Subscriber(String name) {
		this.name = name;
	}

	String getName() {
		return name;
	}

	@Override
	public void update(Observable o, Object arg) {
		if (arg == this) {
			System.out.println(name + " received: " + ((Publisher) o).getMessage());
		}
	}
}

public class Main3 {
	public static void main(String[] args) {
		Publisher publisher = new Publisher();
		Subscriber subscriber1 = new Subscriber("Subscriber 1");
		Subscriber subscriber2 = new Subscriber("Subscriber 2");
		publisher.addSubscriber(subscriber1);
		publisher.addSubscriber(subscriber2);
		publisher.publishMessage("Hello, Subscriber 1!", "Subscriber 1");
	}
}
//为了实现“选择广播式-点对点”的调度策略，我们需要对代码进行一些修改。在这种策略中，发布者需要选择一个或多个订阅者来发送消息。以下是一个简单的实现：
//在这个例子中，我们在Publisher类中添加了一个subscribers的HashMap，用来存储所有的订阅者。我们还添加了一个addSubscriber方法，用来添加订阅者。
//
//我们修改了publishMessage方法，使其可以接收一个或多个订阅者的名字作为参数。当发布消息时，只有这些订阅者会接收到消息。
//
//在Subscriber类中，我们添加了一个getName方法，用来获取订阅者的名字。
//
//在main方法中，我们使用addSubscriber方法添加订阅者，然后使用publishMessage方法发布消息。你可以看到，只有"Subscriber 1"接收到了消息。这就是“选择广播式-点对点”的调度策略。希望这个例子能对你有所帮助！